স্প্রিং বুট ক্লায়েন্টে অ্যাসিনক্রোনাস প্রোগ্রামিং এবং নন-ব্লকিং কলের জন্য CompletableFuture এবং Mono/Flux অত্যন্ত গুরুত্বপূর্ণ। এই দুটি পদ্ধতি পৃথকভাবে কাজ করে, তবে উভয়ই অ্যাসিনক্রোনাস ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়।
১. CompletableFuture এবং এর ব্যবহার
CompletableFuture হলো Java 8-এর একটি ফিচার যা অ্যাসিনক্রোনাস টাস্ক চালানোর জন্য ব্যবহার হয়। এটি ব্লকিং নয় এবং ভবিষ্যতে একটি রেসপন্স রিটার্ন করবে।
CompletableFuture এর প্রাথমিক ব্যবহার:
import java.util.concurrent.CompletableFuture;
public CompletableFuture<String> fetchDataAsync(String url) {
return CompletableFuture.supplyAsync(() -> {
// এখানে HTTP কল বা অন্য কোনো অ্যাসিনক্রোনাস কাজ করুন
return "Response from " + url;
});
}
স্প্রিং বুটে CompletableFuture ব্যবহার:
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
public class ApiClient {
public CompletableFuture<String> getData(String url) {
return CompletableFuture.supplyAsync(() -> {
// HTTP কল (RestTemplate বা WebClient ব্যবহার করুন)
return "Fetched Data from " + url;
});
}
}
CompletableFuture ব্যবহার করে কল করা:
ApiClient client = new ApiClient();
CompletableFuture<String> futureResponse = client.getData("https://api.example.com/data");
futureResponse.thenAccept(response -> {
System.out.println("Response: " + response);
}).exceptionally(ex -> {
System.err.println("Error occurred: " + ex.getMessage());
return null;
});
২. Mono এবং Flux এবং এর ব্যবহার
Mono এবং Flux হলো Spring WebFlux-এর অংশ, যা রিয়াক্টিভ প্রোগ্রামিং মডেলে কাজ করে।
- Mono: একক অবজেক্ট বা ডেটা রিটার্ন করে।
- Flux: একাধিক ডেটার স্ট্রিম রিটার্ন করে।
Mono ব্যবহার:
import reactor.core.publisher.Mono;
public Mono<String> fetchDataMono(String url) {
return Mono.just("Response from " + url);
}
Flux ব্যবহার:
import reactor.core.publisher.Flux;
public Flux<String> fetchDataFlux() {
return Flux.just("Data1", "Data2", "Data3");
}
WebClient এর সাথে Mono এবং Flux ব্যবহার:
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class ApiClient {
private final WebClient webClient;
public ApiClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://api.example.com").build();
}
public Mono<String> getData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToMono(String.class);
}
public Flux<String> getMultipleData(String endpoint) {
return this.webClient.get()
.uri(endpoint)
.retrieve()
.bodyToFlux(String.class);
}
}
Mono এর রেসপন্স প্রসেস করা:
ApiClient client = new ApiClient(WebClient.builder());
client.getData("/data").subscribe(response -> {
System.out.println("Response: " + response);
}, error -> {
System.err.println("Error: " + error.getMessage());
});
৩. CompletableFuture এবং Mono/Flux তুলনা
| বৈশিষ্ট্য | CompletableFuture | Mono/Flux |
|---|---|---|
| মডেল | Imperative | Reactive |
| নন-ব্লকিং | হ্যাঁ | হ্যাঁ |
| অ্যাপ্লিকেশন স্কোপ | Java স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ | Spring WebFlux এবং Reactive |
| ডেটা টাইপ | CompletableFuture | Mono, Flux |
| ডেটা ফ্লো | একক রেসপন্স | একক বা একাধিক রেসপন্স |
| স্ট্রিম সাপোর্ট | নেই | আছে (Reactive Streams) |
৪. CompletableFuture এবং Mono/Flux একসাথে ব্যবহার
Spring অ্যাপ্লিকেশনে CompletableFuture থেকে Mono-তে বা Mono থেকে CompletableFuture-এ রূপান্তর করা যেতে পারে।
CompletableFuture থেকে Mono:
import reactor.core.publisher.Mono;
public Mono<String> convertToMono(CompletableFuture<String> future) {
return Mono.fromFuture(future);
}
Mono থেকে CompletableFuture:
import reactor.core.publisher.Mono;
public CompletableFuture<String> convertToFuture(Mono<String> mono) {
return mono.toFuture();
}
৫. Use Case: মাইক্রোসার্ভিসে অ্যাসিনক্রোনাস কমিউনিকেশন
Example: দুটি API কল নন-ব্লকিং পদ্ধতিতে করা (Mono ব্যবহার):
public Mono<String> callTwoApis() {
Mono<String> api1Response = webClient.get().uri("/api1").retrieve().bodyToMono(String.class);
Mono<String> api2Response = webClient.get().uri("/api2").retrieve().bodyToMono(String.class);
return Mono.zip(api1Response, api2Response, (response1, response2) ->
"Combined Response: " + response1 + ", " + response2
);
}
Example: CompletableFuture দিয়ে সমান্তরাল প্রসেসিং:
public CompletableFuture<String> callTwoApisParallel() {
CompletableFuture<String> api1Future = CompletableFuture.supplyAsync(() -> webClient.get()
.uri("/api1")
.retrieve()
.bodyToMono(String.class)
.block());
CompletableFuture<String> api2Future = CompletableFuture.supplyAsync(() -> webClient.get()
.uri("/api2")
.retrieve()
.bodyToMono(String.class)
.block());
return api1Future.thenCombine(api2Future, (response1, response2) ->
"Combined Response: " + response1 + ", " + response2
);
}
উপসংহার
- Mono/Flux: যখন রিয়াক্টিভ প্রোগ্রামিং প্রয়োজন হয়, যেমন মাইক্রোসার্ভিস বা স্ট্রিম ডেটা প্রসেসিং।
- CompletableFuture: স্ট্যান্ডার্ড Java অ্যাপ্লিকেশনে অ্যাসিনক্রোনাস কাজ পরিচালনা করতে।
স্প্রিং বুট ক্লায়েন্টে এই দুটি প্রযুক্তি ব্যবহার করে অ্যাপ্লিকেশনের স্কেল এবং কর্মক্ষমতা উল্লেখযোগ্যভাবে বৃদ্ধি করা যায়।
Read more